/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package local;

import entity.BancosRegistados;
import entity.CartoesMb;
import java.io.File;
import java.io.FileWriter;
import java.util.Date;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import remote.CorretoraRemote;

/**
 *
 * @author Emanuel
 */
public class CorretoraRemoteImplemented implements CorretoraRemote {

    /**
     * Permite registar a agencia bancária na corretora
     * @param codigoAgencia O código da agencia bancária (Banco + Balcao) = 8 digitos
     * @return Date A hora para o envio diário dos operaçoes online
     */
    public Date registarAgenciaBancaria(Integer codigoAgencia) {
        Date dateNull = null;
        //não interessa a data, apenas a hora e minutos
        Date data = null;
        try {
            BancosRegistados banco = new BancosRegistados(codigoAgencia);
            Random random = new Random();

            //randoms para a hora diaria do envio
            int hora = random.nextInt(24);
            int minutos = random.nextInt(60);

            //não interessa a data, apenas a hora e minutos
            data = new Date(1990, 1, 1, hora, minutos);

            banco.setSuspenso("nao");
            banco.setHoraEnvio(data);

            lookupBancosRegistadosFacade().create(banco);
        } catch (Exception e) {
            return dateNull;
        }

        return data;
    }

    /**
     * Permite registar um novo cartao multibanco associado a uma conta na corretora
     * @param codigoCartao O código que identifica o cartao multibanco
     * @param nib O número de identificaçao bancária da conta do respectivo cartao multibanco
     */
    public void registarCartaoMultibanco(Integer codigoCartao, String nib) {
        int pin;
        String ipin;
        Random random = new Random();
        try {
            pin = getPin();
            ipin = getAlphaNumeric();

            CartoesMb cartao = new CartoesMb(codigoCartao);
            cartao.setIpin(ipin);
            cartao.setPin(pin);
            cartao.setNib(nib);

            lookupCartoesMbFacade().create(cartao);
        } catch (Exception e) {
            try {
                File file = new File("ErroCartao.txt");
                FileWriter fw = new FileWriter(file);

                fw.write(e.getMessage());

                fw.close();
            } catch (Exception ex) {
            }

        }
    }

    private BancosRegistadosFacadeLocal lookupBancosRegistadosFacade() {
        try {
            Context c = new InitialContext();
            return (BancosRegistadosFacadeLocal) c.lookup("java:comp/env/BancosRegistadosFacade");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private String getAlphaNumeric() {
        final String ALPHA_NUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        StringBuffer sb = new StringBuffer(6);
        for (int i = 0; i < 6; i++) {
            int ndx = (int) (Math.random() * ALPHA_NUM.length());
            sb.append(ALPHA_NUM.charAt(ndx));
        }
        return sb.toString();
    }

    private int getPin() {
        final String NUM = "0123456789";
        StringBuffer sb = new StringBuffer(4);
        for (int i = 0; i < 4; i++) {
            int ndx = (int) (Math.random() * NUM.length());
            sb.append(NUM.charAt(ndx));
        }
        return Integer.getInteger(sb.toString());
    }

    private CartoesMbFacadeLocal lookupCartoesMbFacade() {
        try {
            Context c = new InitialContext();
            return (CartoesMbFacadeLocal) c.lookup("java:comp/env/CartoesMbFacade");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }
}
